#ifndef VALIDATOR_H_
#define VALIDATOR_H_

#include <string>
#include <cstring>
#include <vector>
#include <utility>
#include <stack>
#include <algorithm>
#include <boost/optional.hpp>
#include <boost/filesystem.hpp>
#include "../Tinyxml/tinyxml.h"
#include "../Exceptions/InvalidXMLFormatException.h"
#include "MetaDirectory.h"
#include "MetaFile.h"
#include "Scheme.h"


namespace Validator
{


//! Definicia scheme ako datoveho typu 
/*!
 	scheme predstavuje datovy typ ktory je reprezentovany par nazvu(std::string)
	samotnej schemi a kolekciou(std::vector) adresarov ktore sa nachadzaju v 
	korenovom adresary
*/
 

//! Validator trieda. 
/*!
 	Trieda sluzi na validaciu obsahu archivacneho suboru
*/
class Validator
{
	public:
		//! Constructor 
		/*!
 			Konstruktor triedy, ktory preskuma zadany adresar a vyhlada
			vsetky xml subory teda definicie schem.
		*/
		Validator(std::string theSchemeFilesPath);
		~Validator(void);

		//! Init
		/*!
 			Funkcia sluzi na inicializaciu objektu. Samotna inicializacia spociva v nacitani
			schem z ich xml definicii
		*/
		void Init(void);

		//! GetScheme 
		/*!
 			Funkcia na ziskanie schemy podla jej nazvu
			\return prisluchajuca schema
		*/
		boost::optional<Scheme> GetScheme(std::string theSchemeName);

	private:
		std::vector<boost::filesystem::path> mySchemeFiles;
		std::vector<Scheme> mySchemes; 
		Scheme Parse(std::string theFile);
		MetaDirectory ParseDirectory(TiXmlElement *pElem);
		MetaFile ParseFile(TiXmlElement *pElem);
		bool MatchScheme(Scheme theScheme,std::string theSchemeName);

		std::string mySchemePath;


		void re_init();

};

}

#endif